/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logicaNegocio;

import dtos.DTODetalleProducto;
import dtos.DTODetalleServicio;
import dtos.DTOFilaPedidoNegocio;
import dtos.DTOPedido;
import dtos.DTOProducto;
import dtos.DTOServicio;
import java.util.ArrayList;
import java.util.List;
import persistencia.Criterio;
import persistencia.FabricaCriterio;
import persistencia.FachadaPersistencia;
import persistencia.agente.DetallePedidoProducto;
import persistencia.agente.DetallePedidoServicio;
import persistencia.agente.Empleado;
import persistencia.agente.EstadoPedido;
import persistencia.agente.Pedido;

/**
 *
 * @author Sebastian
 */
public class ExpertoProcesarPedido {

    public boolean modificarEstadoPedido(int codNuevoEstadoPedido, DTOFilaPedidoNegocio dTOFilaPedidoNegocio) {
        EstadoPedido nuevoEstadoPedido;
        Criterio criterio;
        int codEstadoActual;
        List<Empleado> empleadosAsignados;

        criterio = FabricaCriterio.getInstancia().obtenerCriterio("nombreEstado", Criterio.OperadorRelacionalEnum.Igual.getString(), dTOFilaPedidoNegocio.getNombreEstadoPedidos(), true);
        codEstadoActual = FachadaPersistencia.getInstancia().buscar(EstadoPedido.class, criterio).get(0).getCodEstadoPedido();

        if ((codEstadoActual + 1) == codNuevoEstadoPedido) {

            criterio = FabricaCriterio.getInstancia().obtenerCriterio("nroPedido", Criterio.OperadorRelacionalEnum.Igual.getString(), dTOFilaPedidoNegocio.getNroPedido(), false);
            Pedido pedido = FachadaPersistencia.getInstancia().buscar(Pedido.class, criterio).get(0);

            criterio = FabricaCriterio.getInstancia().obtenerCriterio("codEstadoPedido", Criterio.OperadorRelacionalEnum.Igual.getString(), codNuevoEstadoPedido, false);
            nuevoEstadoPedido = FachadaPersistencia.getInstancia().buscar(EstadoPedido.class, criterio).get(0);
            pedido.setEstadoPedido(nuevoEstadoPedido);
            FachadaPersistencia.getInstancia().actualizar(Pedido.class, pedido);

            if (nuevoEstadoPedido.getNombreEstadoPedido().equals("Entregado")) {
                if (pedido.getDetallesServicios() != null && !pedido.getDetallesServicios().isEmpty()) {
                    empleadosAsignados = new ArrayList<Empleado>();
                    for (DetallePedidoServicio detallePedidoServicio : pedido.getDetallesServicios()) {
                        empleadosAsignados.add(detallePedidoServicio.getResponsable());
                    }
                    liberarEmpleados(empleadosAsignados);
                }
            }
            enviarNotificacion(dTOFilaPedidoNegocio.getDniPaciente(), dTOFilaPedidoNegocio.getNroPedido(), nuevoEstadoPedido.getNombreEstadoPedido());
            return true;
        } else {
            return false;
        }
    }

    private void enviarNotificacion(String usuario, int nroPedido, String nuevoEstado) {
        String mensaje = "\n El pedido número " + nroPedido + " paso a estado " + nuevoEstado;
        SuscriptorNotificacion.getInstancia().notificar(VariablesSesion.getInstancia().getIdControlador(usuario), mensaje);
    }

    public int getCodigoEstadoPedido(String nombreEstado) {
        Criterio criterio = FabricaCriterio.getInstancia().obtenerCriterio("nombreEstado", Criterio.OperadorRelacionalEnum.Igual.getString(), nombreEstado, true);
        return FachadaPersistencia.getInstancia().buscar(EstadoPedido.class, criterio).get(0).getCodEstadoPedido();
    }

    public DTOPedido verDetallePedido(DTOFilaPedidoNegocio dTOFilaPedidoNegocio) {
        DTOPedido dTOPedido = new DTOPedido();
        dTOPedido.setDtoDetallesProductos(new ArrayList<DTODetalleProducto>());
        dTOPedido.setdTODetallesServicios(new ArrayList<DTODetalleServicio>());
        DTODetalleProducto dTODetalleProducto;
        DTODetalleServicio dTODetalleServicio;
        Criterio criterio;
        Pedido pedido;

        dTOPedido.setNroPedido(dTOFilaPedidoNegocio.getNroPedido());
        dTOPedido.setOidEstadoPedido(dTOFilaPedidoNegocio.getNombreEstadoPedidos());
        criterio = FabricaCriterio.getInstancia().obtenerCriterio("nroPedido", Criterio.OperadorRelacionalEnum.Igual.getString(), dTOFilaPedidoNegocio.getNroPedido(), false);
        pedido = FachadaPersistencia.getInstancia().buscar(Pedido.class, criterio).get(0);

        for (DetallePedidoProducto detallePedidoProducto : pedido.getDetallesProductos()) {
            dTODetalleProducto = new DTODetalleProducto();
            dTODetalleProducto.setdTOProducto(new DTOProducto());
            dTODetalleProducto.getdTOProducto().setNombreProducto(detallePedidoProducto.getProducto().getNombreProducto());
            dTODetalleProducto.getdTOProducto().setMarca(detallePedidoProducto.getProducto().getMarca());
            dTODetalleProducto.getdTOProducto().setDescripcion(detallePedidoProducto.getProducto().getDescripcionProducto());
            dTODetalleProducto.setCantidadSeleccionada(detallePedidoProducto.getCantidad());
            dTODetalleProducto.setSubtotal(detallePedidoProducto.getImporteSubtotal());
            dTOPedido.getDtoDetallesProductos().add(dTODetalleProducto);
        }

        for (DetallePedidoServicio detallePedidoServicio : pedido.getDetallesServicios()) {
            dTODetalleServicio = new DTODetalleServicio();
            dTODetalleServicio.setdTOServicio(new DTOServicio());
            dTODetalleServicio.getdTOServicio().setNombreServicio(detallePedidoServicio.getServicio().getNombreServicio());
            dTODetalleServicio.getdTOServicio().setDescripcionServicio(detallePedidoServicio.getDescripcion());
            dTODetalleServicio.setFechaPrestacion(detallePedidoServicio.getFechaHoraInicio());
            dTODetalleServicio.getdTOServicio().setDuracion(detallePedidoServicio.getServicio().getTiempoDuracionUnitario());
            dTODetalleServicio.setSubtotal(detallePedidoServicio.getImporteSubtotal());
            dTOPedido.getdTODetallesServicios().add(dTODetalleServicio);
        }
        return dTOPedido;
    }

    public void liberarEmpleados(List<Empleado> empleados) {
        if (empleados != null) {
            for (Empleado emp : empleados) {
                emp.setDisponible(true);
                FachadaPersistencia.getInstancia().actualizar(Empleado.class, emp);
            }
        }
    }
}
